package org.practice.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.practice.util.Constant;
/**
 * @author jack
 * 过滤器:在servlet容器启动时调用一次，以后对request,response过滤掉一些信息或者提前设置一些参数(比如过滤掉非法url,设置字符集编码等)，然后再执行 action，由链栈维护其回调过程。
 * 拦截器：是面向切面编程的运用，在执行Action时切入其它业务逻辑。 
 * 在action的生命周期中，拦截器可以多次被调用，而过滤器只能在容器初始化时被调用一次 ，执行顺序 ：过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
 * 拦截器与过滤器的区别 ：
 * 拦截器是基于java的反射机制的，是AOP编程的运用，而过滤器是基于函数回调。 
 * 拦截器不依赖与servlet容器，过滤器依赖与servlet容器。 
 * 拦截器只能对action请求起作用，而过滤器则可以对几乎所有的请求起作用（比如直接请求jsp，拦截器就不起作用）。 
 * 拦截器可以访问action上下文、值栈里的对象，而过滤器不能访问。 
 */
public class AuthenticateSessionFilter implements Filter {

	String[]exclude_arr = null;

	public void destroy() {
	}

	public void init(FilterConfig fConfig) throws ServletException {
		String exclude = fConfig.getInitParameter("exclude");
		if(exclude!=null){
			exclude_arr = exclude.split(",");
		}
	}
	
	/**
	 * 过滤登陆的action请求（配置过滤器初始化参数InitParameter），验证seesion是否失效，session超时，tomcat服务器会将当前session置为invalid，然后重定向提示页面，并终止调用过滤器链
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		String requestURI = ((HttpServletRequest)request).getRequestURI();
		if(requestURI!=null){//http://localhost:8080/dang-shop2/login.action
			requestURI = requestURI.substring(requestURI.lastIndexOf("/")+1);
		}
		System.out.println(requestURI);//login.action
		boolean isExclude = false;
		if(exclude_arr!=null){
			for(String exclude:exclude_arr){
				if(exclude!=null&&!"".equals(exclude.trim())){
					if(exclude.equals(requestURI)){
						isExclude = true;
						break;
					}
				}
			}
		}
		if(!isExclude){
			Object o=((HttpServletRequest)request).getSession(true).getAttribute(Constant.SESSION_KEY_USER);
			if(o==null){
				((HttpServletResponse)response).sendRedirect(((HttpServletRequest)request).getContextPath()+"/shop/login.action");
				return;
			}
		}
		chain.doFilter(request, response);
		
	}

}
